﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using EntidadesNegocio;
using BIOrdenes;

namespace BLGestionOrdenes
{
    public class AuthenticationManager
    {
        private static AuthenticationManager _instance;
        private string _archConfiguracion;

        private AuthenticationManager(string lpArchConfiguracion)
        {
            this._archConfiguracion = lpArchConfiguracion;
        }

        private IEntidad _entidad;
        private IProcedimientoAlmacenado _procedimiento;
        public static AuthenticationManager Instance(string lpArchConfiguracion)
        {
            if (_instance == null)
                _instance = new AuthenticationManager(lpArchConfiguracion);
            return _instance;
        }

        private LoginInfo _login;
        public LoginInfo Authenticate(string lpLogin, string lpPassword)
        {
           _procedimiento = EntidadFabrica.CrearProcedimientoAlmacenado("Login", "Seguridad", this._archConfiguracion);
           DataTable lvLogin = _procedimiento.EjecutarQuery().Tables[0];
           _login = new LoginInfo(lvLogin);
           return _login;
        }

        public MenuAccesoCollection Authorize()
        {
            if (!_login.IsAuthenticated)
                throw new InvalidOperationException("User is not authenticated.");

            _procedimiento = EntidadFabrica.CrearProcedimientoAlmacenado("Authorize", "Seguridad", this._archConfiguracion);
            _procedimiento.Parametros["login_id"].Valor = _login._login; 
            DataTable lvLogin = _procedimiento.EjecutarQuery().Tables[0];

            MenuAccesoCollection _menus = new MenuAccesoCollection();
            _menus.LoadData(lvLogin);
            return _menus;
        }

        public DataTable GetMenu()
        {
            _entidad = EntidadFabrica.CrearEntidad("Menus", "Seguridad", this._archConfiguracion);
            
            return _entidad.SpSelect.EjecutarQuery().Tables[0]; 
        }
    }
}
